這篇是一個精華的濃縮,我強烈推薦我的入坑讀物:
https://www.madstacks.dev/posts/V8-Exploitation-Series-Part-1 [1]
今天就來講 JS Engine 的攻擊流程串大概會是怎麼樣!
(拋開 v8 細節不談,因為這次主角也不是它但概念都很通用)
首先,先來介紹 JS 裡面 Array Object 的結構:
分為 map, properties, elements, len 四個段落
elements 和 len 很好懂,一個是一排指標,指向 Array 內的每個元素實際內容,len 則是 Array 長度。
properties 就是這個 Array Object 的信標,map 則是指向一個 Array 當中每項內容要被具體解析成哪種類型的物件/屬性名稱等的 Metadata 表。
今天的攻擊情境是:
主流攻擊流程則是(主要跟 elements 相關而已)
故意建立一個 Array A,我們從 A 的地址 + 一段距離的偏移 的地址 Fake 一個 Array Object 出來(那個地址會故意落在我們可控的別的 Array 的 elements (變數) 內容裡),也就是我們能客製化一個 Array Object 的任意參數。
接下來就好辦啦~我們可以透過竄改 elements 指向的地址去我們想寫入/讀取的地方,再從 Fake 起來的 Array Object 完成任意的資料讀取。
達成任意地址讀寫後,通常會選擇想辦法二次寫入一段 rwx 的記憶體、再透過 wasm 或者 JIT (Just In Time) 優化後的程式碼來執行它。
想練習相關技術也可以上 pwn.college 打打,筆者也寫過一系列 Writeup[2]